package array;


/**
 * @author huang (1431471764@qq.com)
 * @date 2025/8/5 06:41
 */

/**
 * @author 随风coding
 * @version 1.0
 * @date 2025/8/5 06:41
 * @description
 */
public class SortedArraySquare {
    /**
     * 双指针 有序数组的平方
     *
     * @param origin 原数组
     * @return 新数组
     */
    public static int[] method1(int[] origin) {
        //1.下标 新数组元素起始下标 origin数组的左、右指针
        int k = origin.length - 1;
        int i = 0;
        int j = origin.length - 1;
        int[] res = new int[origin.length];
        //等于的时候也要处理因为还有最后一个元素未处理
        while (i <= j) {
            if (origin[i] * origin[i] < origin[j] * origin[j]) {
                //赋值大的到新数组
                res[k] = origin[j] * origin[j];
                //j--
                j--;
                //k--
                k--;
            } else {
                res[k] = origin[i] * origin[i];
                i++;
                k--;
            }
        }
        return res;
    }

    // 测试方法
    public static void main(String[] args) {
        // 测试用例1：含负数的标准情况
        int[] input1 = {-4, -1, 0, 3, 10};
        printResult("测试1", input1, new int[]{0, 1, 9, 16, 100});

        // 测试用例2：全正数数组
        int[] input2 = {1, 2, 3, 4, 5};
        printResult("测试2", input2, new int[]{1, 4, 9, 16, 25});

        // 测试用例3：全负数数组
        int[] input3 = {-5, -4, -3, -2, -1};
        printResult("测试3", input3, new int[]{1, 4, 9, 16, 25});

        // 测试用例4：单个元素
        int[] input4 = {-5};
        printResult("测试4", input4, new int[]{25});

        // 测试用例5：空数组
        int[] input5 = {};
        printResult("测试5", input5, new int[]{});
    }

    // 打印测试结果
    private static void printResult(String testName, int[] input, int[] expected) {
        int[] result = method1(input);
        boolean passed = java.util.Arrays.equals(result, expected);

        System.out.println("---- " + testName + " ----");
        System.out.println("输入: " + java.util.Arrays.toString(input));
        System.out.println("预期: " + java.util.Arrays.toString(expected));
        System.out.println("结果: " + java.util.Arrays.toString(result));
        System.out.println("测试: " + (passed ? "通过 ✅" : "失败 ❌"));
        System.out.println();
    }
}
